﻿using Common.Communal;
using ERP.Domain.Warehouse;
using MediatR;
using Microsoft.AspNetCore.Mvc;
using Warehouse.API.Read.App.Commands;
using Warehouse.Dto;

namespace Warehouse.API.Read.HubService
{
    /// <summary>
    /// 通用业务服务类 - 实现 SignalR Hub 与业务逻辑的解耦
    /// 采用 CQRS 模式，通过 MediatR 处理查询请求
    /// 负责协调 SignalR Hub 和具体的业务处理器之间的交互
    /// </summary>
    public class CommonService
    {
        #region 私有字段

        /// <summary>
        /// MediatR 中介者 - 实现命令查询分离模式
        /// 负责将请求路由到对应的处理器，实现松耦合架构
        /// </summary>
        private readonly IMediator _mediator;

        #endregion

        #region 构造函数

        /// <summary>
        /// 构造函数 - 依赖注入初始化
        /// </summary>
        /// <param name="mediator">MediatR 中介者实例</param>
        public CommonService(IMediator mediator)
        {
            _mediator = mediator;
        }

        #endregion

        #region 公共方法

        /// <summary>
        /// 发送消息处理 - 实现实时数据查询的核心方法
        /// 通过 MediatR 将查询请求路由到对应的处理器
        /// 实现 SignalR Hub 与业务逻辑的分离
        /// </summary>
        /// <param name="request">查询请求对象 - 包含查询条件和分页参数</param>
        /// <returns>查询结果 - 包含分页数据和状态信息</returns>
        internal async Task<ApiResult<ApiPaging<InventorySummaryDto>>> SendMessage(ReportSummary request)
        {
            try
            {
                // 通过 MediatR 发送查询请求
                // 这会自动路由到 ReportSummaryHanders 处理器进行处理
                // 实现了命令查询分离模式（CQRS）
                var result = await _mediator.Send(request);
                
                return result;
            }
            catch (Exception ex)
            {
                // 异常处理 - 返回统一的错误响应格式
                return new ApiResult<ApiPaging<InventorySummaryDto>>
                {
                    Code = EnumCode.Fail,                    // 错误状态码
                    Message = $"查询失败: {ex.Message}",      // 错误信息
                    Data = null                              // 空数据
                };
            }
        }

        #endregion

        #region 私有辅助方法

        /// <summary>
        /// 验证请求参数 - 确保请求数据的有效性
        /// </summary>
        /// <param name="request">查询请求对象</param>
        /// <returns>验证结果</returns>
        private bool ValidateRequest(ReportSummary request)
        {
            // 检查请求对象是否为空
            if (request == null)
            {
                return false;
            }

            // 检查分页参数的有效性
            if (request.pageindex < 1 || request.pagesize < 1)
            {
                return false;
            }

            // 检查页大小是否超过最大限制
            if (request.pagesize > 1000)
            {
                return false;
            }

            return true;
        }

        /// <summary>
        /// 构建错误响应 - 创建统一的错误响应格式
        /// </summary>
        /// <param name="errorCode">错误代码</param>
        /// <param name="errorMessage">错误信息</param>
        /// <returns>错误响应对象</returns>
        private ApiResult<ApiPaging<InventorySummaryDto>> BuildErrorResponse(EnumCode errorCode, string errorMessage)
        {
            return new ApiResult<ApiPaging<InventorySummaryDto>>
            {
                Code = errorCode,
                Message = errorMessage,
                Data = null
            };
        }

        #endregion
    }
}
